/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package msnclient;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import msncommonsc.EnumEstado;
import msncommonsc.MensajeDTO;
import msncommonsc.Persona;

/**
 *
 * @author Martin
 */
public class Controladora {

    private static Controladora instance;
    private OTablaContacto tablaContactos;
    private List<ObservadorGUI> listaObservadoresGUI = new ArrayList<ObservadorGUI>();
    private Cliente cliente;
    private ONuevoChat nuevoChat ;

    public ONuevoChat getNuevoChat() {
        return nuevoChat;
    }

    public void setNuevoChat(ONuevoChat nuevoChat) {
        this.nuevoChat = nuevoChat;
    }

    private Controladora() throws RemoteException, NotBoundException {
        cliente = Cliente.getInstancia();
    }

    public static Controladora getInstancia() throws RemoteException, NotBoundException {
        if (instance == null) {
            instance = new Controladora();
        }
        return instance;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<ObservadorGUI> getListaObservadoresGUI() {
        return listaObservadoresGUI;
    }

    public void setListaObservadoresGUI(List<ObservadorGUI> listaObservadoresGUI) {
        this.listaObservadoresGUI = listaObservadoresGUI;
    }

    public OTablaContacto getTablaContactos() {
        return tablaContactos;
    }

    public void setTablaContactos(OTablaContacto tablaContactos) {
        this.tablaContactos = tablaContactos;
    }

    public String crearCuenta(String nombre, String nick, String contraseña) throws RemoteException, NotBoundException {
        try {
            String crearCuenta;
            if (!nombre.equals("") && !nick.equals("") && !contraseña.equals("")) {
                if (cliente.crearCuenta(nombre, nick, contraseña)) {
                    crearCuenta = "La cuenta se a creado correctamente";
                } else {
                    crearCuenta = "El usuario ingresado ya existe !!!";
                }
            } else {
                crearCuenta = "Le falto ingresar algun dato";
            }
            return crearCuenta;
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public Boolean conectar(String nombre, String contraseña) throws RemoteException {
        try {
            return cliente.conectar(nombre, contraseña);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }

    public boolean enviarMensaje(String destino, String mensaje) {
        try {
            return cliente.enviarMensaje(destino, mensaje);
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public void cambiarEstado(EnumEstado estado) {
        try {
            cliente.cambiarEstado(estado);
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public String cambiarDatosPersonales(String nick, String contraseñaN, String contraseñaV) {
        try {
            int cambiarDatos = cliente.cambiarDatosPersonales(nick, contraseñaN, contraseñaV);
            String respuesta;
            if (cambiarDatos == 1) {
                respuesta = "Se cambio correctamente el nick";
            } else if (cambiarDatos == 2) {
                respuesta = "Se cambio correctamente la contraceña";
            } else if (cambiarDatos == 3) {
                respuesta = "Se cambio correctamente el nick y contraceña";
            } else {
                respuesta = "no se pudieron cambiar los datos x algun motivo";
            }
            return respuesta;
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public String agregarContacto(String nombre) {
        try {
            String respuesta;
            boolean agrrgar = cliente.agregarContacto(nombre);
            if (agrrgar) {
                tablaContactos.notificarContacto();
                respuesta = "Se agrego correctamente";
            } else {
                respuesta = "No se pudo agregar el contacto";
            }
            return respuesta;
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public Boolean desconectar() {
        try {
            return cliente.desconectar();
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
    
    

    public void recibirMensaje(MensajeDTO msj) {
        try {
            boolean x = true;
            for (int i = 0; i < this.listaObservadoresGUI.size(); i++) {
                if (this.listaObservadoresGUI.get(i).obtenerNombre().equals(msj.getOrigen())) {
                    this.listaObservadoresGUI.get(i).notificarRecibir(msj);
                    x= false;
                }
            }
            if (x){
                nuevoChat.recibirChat(msj);
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

    public Persona obtenerPersona() {
        return cliente.getP();
    }

    public void notificarNick() {
        tablaContactos.notificarContacto();
    }

    public void notificarEstado() {
        tablaContactos.notificarContacto();
    }

    public void registrarChat (ObservadorGUI o){
        this.listaObservadoresGUI.add(o);
    }

    public void quitarChat (String nombre){
        try {
            for (int i = 0; i < this.listaObservadoresGUI.size(); i++) {
                if (this.listaObservadoresGUI.get(i).obtenerNombre().equals(nombre)) {
                    this.listaObservadoresGUI.remove(i);
                }
            }
        } catch (Exception e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
    public void guardarCombersacion(String nombre, Boolean boo)throws RemoteException {
        try {
            cliente.guardarCombersacion(nombre, boo);
        } catch (Exception e) {
            throw new UnsupportedOperationException(e.toString());
        }
    }
}
